package main

import (
	"fmt"
	"math"
	"math/cmplx"
)

//var aa = 3  // 包内变量  不是全局变量
//var ss = "lkkk"
// bb :=true  // 函数外面不能用:=

// 可以用一个var 总体定义变量
var (
	aa = 3
	bb = "sss"
)

func variableZeroValue() {
	var a int
	var s string
	fmt.Printf("%d %q\n", a, s)
}

func variableInitialValue() {
	var a, b int = 3, 7
	var s string = "abc" // 类型可以省略
	fmt.Println(a, s, b)
}

func variableTypeDeduction() {
	var a, b, c, s = 3, 5, true, "def"
	fmt.Println(a, b, c, s)
}

func variableShorter() {
	a, b, c, s := 3, 5, true, "def" // 用冒号, 省略var
	b = 8                           // 第二次不能用var, : 重复定义
	fmt.Println(a, b, c, s)
}

func euler1() {
	c := 3 + 4i
	fmt.Println(cmplx.Abs(c)) // 复数的库cmplx
}

func euler() {
	fmt.Println(
		//cmplx.Pow(math.E, 1i*math.Pi)+1
		cmplx.Exp(1i*math.Pi) + 1)
	fmt.Printf("%.2f\n",
		cmplx.Exp(1i*math.Pi)+1)
}

func triangle() {
	var a, b int = 3, 4
	var c int
	c = int(math.Sqrt(float64(a*a + b*b))) //强制类型转换
	fmt.Println(c)
}

func consts() { //常量
	//const filename = "abc.txt"
	//const a, b = 3, 4
	const (
		filename = "abc.txt"
		a, b     = 3, 4 //常量的数值可作为各种类型使用
	)
	var c int
	c = int(math.Sqrt(a*a + b*b))
	fmt.Println(filename, c)
}

func enums() {
	//const(
	//	cpp = 0
	//	java = 1
	//	python = 2
	//	golang = 3
	//)
	const (
		cpp = iota // 自增枚举类型 iota从0
		java
		_ // 跳过
		_
		python // 4
		golang // 5
	)
	// b kb mb gb tb pb
	const (
		b  = 1 << (10 * iota) // 1左移10*iota位
		kb                    // 左移10位 = 10,000,000,000 => 2^10 =1024
		mb
		gb
		tb
		pb
	)
	fmt.Println(cpp, java, python, golang)
	fmt.Println(b, kb, mb, gb, tb, pb)
}

func main() {
	fmt.Println("Hello World")
	variableZeroValue()
	variableInitialValue()
	variableTypeDeduction()
	variableShorter()
	fmt.Println(aa, bb)
	euler1()
	euler()
	triangle()
	consts()
	enums()
}
